package algorithm.子集;

import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.List;

public class Solution2 {

    List<Integer> t = new ArrayList<Integer>();
    List<List<Integer>> ans = new ArrayList<List<Integer>>();

    public static void main(String[] args) {
        int [] arr=new int[]{1,2,3,4};
        Solution solution=new Solution();
        List<List<Integer>> rs=solution.subsets(arr);
        rs.forEach(list->System.out.println(StringUtils.join(list,",")));
    }

    public List<List<Integer>> subsets(int[] nums) {
        int n = nums.length;
        //子集个数=2的n次方，子集就相当于从n个数据选择0-n个数，那么每个数要么选中要么不选中(1或者0)
        for (int mask = 0; mask < (1 << n); ++mask) {
            t.clear();
            //二进制：按位与，决定i位是否选中
            for (int i = 0; i < n; ++i) {
                if ((mask & (1 << i)) != 0) {
                    t.add(nums[i]);
                }
            }
            ans.add(new ArrayList<Integer>(t));
        }
        return ans;
    }
}

//        作者：LeetCode-Solution
//        链接：https://leetcode.cn/problems/subsets/solution/zi-ji-by-leetcode-solution/
//        来源：力扣（LeetCode）
//        著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。